package cloud.seri.iot.manager.client

import cloud.seri.iot.common.api.ProductManager
import cloud.seri.iot.common.model.CreateProductDTO
import cloud.seri.iot.common.model.ListProductByTagsDTO
import cloud.seri.iot.common.model.PageRequestDTO
import cloud.seri.iot.common.model.UpdateProductDTO
import com.aliyuncs.iot.model.v20180120.*
import org.springframework.web.bind.annotation.*

@AuthorizedFeignClient("seri-iot-aliyun")
interface ProductManagerClient : ProductManager
{
    /**
     * 新建产品
     * @param dto CreateProductDTO
     * @return CreateProductResponse?
     */
    @PostMapping("/api/products")
    override fun createProduct(@RequestBody dto: CreateProductDTO): CreateProductResponse?

    /**
     * 查询产品详细信息。
     * @param pk String
     * @return QueryProductResponse?
     */
    @GetMapping("/api/products/{pk}")
    override fun queryProduct(@PathVariable pk: String): QueryProductResponse?

    /**
     * 查询产品列表
     * @param dto PageRequestDTO
     * @return QueryProductListResponse?
     */
    @GetMapping("/api/products/list")
    override fun queryProductList(@RequestBody dto: PageRequestDTO): QueryProductListResponse?

    /**
     * 修改产品信息
     * @param dto UpdateProductDTO
     * @return UpdateProductResponse?
     */
    @PutMapping("/api/products")
    override fun updateProduct(@RequestBody dto: UpdateProductDTO): UpdateProductResponse?

    /**
     * 创建产品标签
     * @param pk String 产品Key，物联网平台为产品颁发的唯一标识。
     * @param tags List<String> 要创建的标签。标签包括TagKey和TagValue，分别对应标签的key和value。
     * @return CreateProductTagsResponse?
     */
    @PostMapping("/api/products/tags/{pk}")
    override fun createProductTags(@PathVariable pk: String, @RequestBody tags: List<CreateProductTagsRequest.ProductTag>): CreateProductTagsResponse?

    /**
     * 删除指定产品
     * @param pk String
     * @return DeleteProductResponse?
     */
    @DeleteMapping("/api/products/{pk}")
    override fun deleteProduct(@PathVariable pk: String): DeleteProductResponse?

    /**
     *
     * @param pk String
     * @param tags List<String>
     * @return DeleteProductTagsResponse?
     */
    @DeleteMapping("/api/products/tags/{pk}")
    override fun deleteProductTags(@PathVariable pk: String, @RequestBody tags: List<String>): DeleteProductTagsResponse?

    /**
     *
     * @param tags List<String>
     * @param dto PageRequestDTO
     * @return ListProductByTagsResponse?
     */
    @GetMapping("/api/products/tags/list")
    override fun listProductByTags(@RequestBody dto: ListProductByTagsDTO): ListProductByTagsResponse?

    /**
     *
     * @param pk String
     * @return ListProductTagsResponse?
     */
    @GetMapping("/api/products/tags/{pk}")
    override fun listProductTags(@PathVariable pk: String): ListProductTagsResponse?

    /**
     *
     * @param pk String
     * @param tags List<String>
     * @return UpdateProductTagsResponse?
     */
    @PostMapping("/api/products/tags/{pk}")
    override fun updateProductTags(@PathVariable pk: String, @RequestBody tags: List<UpdateProductTagsRequest.ProductTag>): UpdateProductTagsResponse?
}
